// AI服务模块，用于与LM Studio API进行通信

// LM Studio API配置
export const LM_STUDIO_CONFIG = {
  apiUrl: 'http://localhost:1234/v1/chat/completions',
  model: 'gpt-4o-mini',
  temperature: 0.7,
  maxTokens: 1000,
  systemPrompt: '你是一个有帮助的AI助手。'
};

/**
 * 与LM Studio API通信，获取AI回复
 * @param {string} userMessage - 用户的输入消息
 * @param {Array} chatHistory - 聊天历史记录
 * @param {Array} files - 用户上传的文件（图片）
 * @returns {Promise<string>} AI的回复内容
 */
export async function getAIResponse(userMessage, chatHistory = [], files = []) {
  try {
    // 准备请求头
    const headers = {
      'Content-Type': 'application/json'
    };

    // 构建完整的聊天上下文
    const currentChat = [
      { role: 'system', content: LM_STUDIO_CONFIG.systemPrompt }
    ];

    // 添加聊天历史记录（已经是正确的格式）
    if (chatHistory && chatHistory.length > 0) {
      currentChat.push(...chatHistory);
    }

    // 处理用户消息和图片，支持多模态输入
    let userContent = [];
    
    // 添加文本内容
    if (userMessage && userMessage.trim()) {
      userContent.push({
        type: 'text',
        text: userMessage.trim()
      });
    }
    
    // 添加图片内容（如果有）
    if (files && files.length > 0) {
      for (const file of files) {
        // 确保只处理图片文件
        if (file.type && file.type.startsWith('image/')) {
          // 从data URL中提取base64数据
          // 
          const base64Data = file.url.split(',')[1];
          
          userContent.push({
            type: 'image_url',
            image_url: {
              url: `data:${file.type};base64,${base64Data}`
            }
          });
        }
      }
    }
    
    // 如果没有文本和图片，提供一个默认消息
    if (userContent.length === 0) {
      userContent = [{ type: 'text', text: '用户发送了一个空消息' }];
    }
    
    // 添加当前用户消息（可能包含文本和图片）
    currentChat.push({
      role: 'user',
      content: userContent.length === 1 && userContent[0].type === 'text' ? 
               userContent[0].text : userContent
    });

    // 准备请求数据
    const data = {
      model: LM_STUDIO_CONFIG.model,
      messages: currentChat,
      temperature: LM_STUDIO_CONFIG.temperature,
      max_tokens: LM_STUDIO_CONFIG.maxTokens
    };

    // 添加自定义超时处理
    const timeoutPromise = new Promise((_, reject) => {
      setTimeout(() => reject(new Error('API请求超时：连接LM Studio服务超过30秒')), 30000);
    });

    // 发送API请求，使用Promise.race实现超时控制
    const response = await Promise.race([
      fetch(LM_STUDIO_CONFIG.apiUrl, {
        method: 'POST',
        headers: headers,
        body: JSON.stringify(data)
      }),
      timeoutPromise
    ]);

    // 检查响应状态
    if (!response.ok) {
      const errorText = await response.text();
      throw new Error(`API请求失败: ${response.status} - ${errorText}`);
    }

    // 处理响应数据
    const result = await response.json();
    const content = result.choices[0].message.content;
    return content;
  } catch (error) {
    console.error('与LM Studio API通信时发生错误:', error);
    throw error;
  }
}

/**
 * 检查LM Studio API是否可以正常访问
 * @returns {Promise<boolean>} API是否可用
 */
export async function checkApiAvailability() {
  try {
    // 添加自定义超时处理
    const timeoutPromise = new Promise((_, reject) => {
      setTimeout(() => reject(new Error('检查API可用性超时')), 5000);
    });

    const response = await Promise.race([
      fetch(LM_STUDIO_CONFIG.apiUrl, {
        method: 'GET'
      }),
      timeoutPromise
    ]);
    return response.ok;
  } catch (error) {
    console.error('检查LM Studio API可用性失败:', error);
    return false;
  }
}